package com.servicios.datos.app.comun.impl;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.core.app.bd.ConexionJDBC;
import com.core.app.bd.query.Query;
import com.core.app.servicios.ExcepcionServicio;
import com.modelo.datos.app.Status;
import com.modelo.datos.mapping.jdbc.comun.StatusMapeo;
import com.objetos.transf.datos.app.comun.ObtenerStatusPorCriterioPeticion;
import com.objetos.transf.datos.app.comun.ObtenerStatusPorCriterioRespuesta;
import com.servicios.datos.app.comun.ObtenerStatusPorCriterio;
import com.servicios.datos.excepcion.ExcepcionServicioDatos;

public class ObtenerStatusPorCriterioImpl implements ObtenerStatusPorCriterio {
	
	private Query query;
	private ConexionJDBC conexion;
		
	public Query getQuery() {
		return query;
	}
	public void setQuery(Query query) {
		this.query = query;
	}

	public ConexionJDBC getConexion() {
		return conexion;
	}

	public void setConexion(ConexionJDBC conexion) {
		this.conexion = conexion;
	}


	@Override
	public ObtenerStatusPorCriterioRespuesta ejecutar(
			ObtenerStatusPorCriterioPeticion peticion) throws ExcepcionServicio {
		
		ObtenerStatusPorCriterioRespuesta respuesta;
		StatusMapeo statusMapeo = new StatusMapeo();
		List<Status> listaStatus = new ArrayList<Status>();
		
		try{
			conexion.abrir();
			query.crearDeclaracion(peticion);
			query.prepararDeclaracion(conexion.getConnection(), peticion);
			conexion.crearPreparedStatement(query);
			conexion.ejecutarPreparedStamentQuery(query);
			ResultSet resultSet = conexion.getResultSet(); 
			
			while(resultSet.next()){
				Status status = new Status();
				statusMapeo.mapear(resultSet, status);
				listaStatus.add(status);
				status = null;
			}
			
		}catch(Throwable e){
			throw new ExcepcionServicioDatos("Ocurrio un error en el servicio ObtenerStatusPorCriterio.-" + e.getMessage(), e.getCause()); 
		}finally{
			statusMapeo = null;
			try {
				conexion.cerrar();
			} catch (Throwable excepcion) {
				// TODO Auto-generated catch block
				excepcion.printStackTrace();
			}
		}
		respuesta = new ObtenerStatusPorCriterioRespuesta();
		respuesta.setStatusSolicitud(listaStatus);
		return respuesta;
	}

}
